from pyftpdlib.authorizers import DummyAuthorizer  # 用于创建授权器
from pyftpdlib.handlers import FTPHandler  # 用于处理 FTP 请求
from pyftpdlib.servers import FTPServer  # 用于启动 FTP 服务器
import pymysql  # 用于连接和操作 MySQL 数据库
import os  # 用于操作文件和路径
import shutil  # 用于移动文件

# 配置 MySQL 连接
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='123456',  # 数据库密码
    database='local1'  # 数据库名称
)


def get_next_id():
    try:
        with db.cursor() as cursor:
            cursor.execute("SELECT COALESCE(MAX(id), 0) + 1 FROM images")
            next_id = cursor.fetchone()[0]
        return next_id
    except Exception as e:
        print(f"获取下一个 ID 时出错: {e}")
        return None


def create_table_if_not_exists():
    # 创建表格的 SQL 语句
    create_table_query = """
    CREATE TABLE IF NOT EXISTS images (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        path VARCHAR(255) NOT NULL
    )
    """
    try:
        with db.cursor() as cursor:
            cursor.execute(create_table_query)  # 执行创建表格的 SQL 语句
            db.commit()  # 提交事务
        print("表格 'images' 已检查或创建")
    except Exception as e:
        print(f"创建表格时出错: {e}")


def is_filename_exists(filename):
    try:
        with db.cursor() as cursor:
            cursor.execute("SELECT COUNT(*) FROM images WHERE name = %s", (filename,))
            count = cursor.fetchone()[0]
        return count > 0
    except Exception as e:
        print(f"检查文件名是否存在时出错: {e}")
        return False


# 自定义 FTP 处理程序
class MyHandler(FTPHandler):
    # 当文件接收完成时调用此方法
    def on_file_received(self, file):
        try:
            # 创建目标目录（当前文件夹下的 pic 文件夹）
            target_dir = os.path.join(os.getcwd(), 'pic')
            os.makedirs(target_dir, exist_ok=True)

            # 移动文件到目标目录
            filename = os.path.basename(file)
            target_path = os.path.join(target_dir, filename)

            # 如果文件已经存在，则先删除旧文件
            if os.path.exists(target_path):
                os.remove(target_path)

            shutil.move(file, target_path)

            # 检查文件名是否已经存在于数据库中
            if not is_filename_exists(filename):
                # 获取下一个 ID
                next_id = get_next_id()
                if next_id is None:
                    print("无法获取下一个 ID")
                    return

                # 将文件路径和文件名存储到 MySQL 数据库
                with db.cursor() as cursor:
                    sql = 'INSERT INTO images (id, name, path) VALUES (%s, %s, %s)'  # SQL 插入语句
                    cursor.execute(sql, (next_id, filename, target_path))  # 执行 SQL 插入操作
                    db.commit()  # 提交事务
                print(f"文件 {filename} 的路径 {target_path} 已存储到数据库")  # 打印成功信息
            else:
                print(f"文件名 {filename} 已存在于数据库中，跳过插入")

        except Exception as e:
            print(f"处理文件时出错: {e}")  # 打印错误信息


def main():
    # 创建上传目录
    upload_dir = os.path.join(os.getcwd(), 'uploads')
    os.makedirs(upload_dir, exist_ok=True)  # 如果目录不存在，则创建它

    # 创建授权器
    authorizer = DummyAuthorizer()
    # 允许匿名用户在 /uploads 目录下进行读取和列出操作
    authorizer.add_anonymous(upload_dir, perm='elradfmwMT')
    # 允许用户名为 'user'，密码为 '12345' 的用户在 /uploads 目录下进行所有操作
    authorizer.add_user('user', '12345', upload_dir, perm='elradfmwMT')

    # 创建 FTP 处理程序并设置授权器
    handler = MyHandler
    handler.authorizer = authorizer

    # 确保表格存在
    create_table_if_not_exists()

    # 启动 FTP 服务器
    address = ('', 2121)  # 服务器绑定地址和端口，空字符串表示绑定所有可用接口
    server = FTPServer(address, handler)  # 创建 FTP 服务器实例
    server.serve_forever()  # 启动服务器并持续运行


if __name__ == '__main__':
    main()  # 如果此文件是主程序，则调用 main 函数启动 FTP 服务器
